package pl.model.service;

import java.util.Date;
import java.util.Random;

import org.apache.commons.lang.StringUtils;

import pl.model.dao.BookDao;
import pl.model.domain.Author;
import pl.model.domain.Book;


public class RandomObjectFactory {
	

	protected final Integer TITLELEN = 5;
	protected final Integer DESCRIPTIONLEN = 20;
	protected final Integer TAGSLEN = 2;
	protected final Integer MAXRANK = 100;
	
	public String[] getWords() {
		return words;
	}

	public String[] getTags() {
		return tags;
	}

	protected final Random rand = new Random(); 
	
	protected final String[] words = {"Jan", "Adam", "Wojciech", "Marek",
		"kot", "pies", "spacja", "wiadro", "kominek", "sen", "sloik", "wiewiorka", "zakwasy", "brzuch", "biodro", "winogrono", 
		"kwiatek", "konewka", "doniczka", "krew", "komputer", "obraz", "rama", "niebo", "kolacja", "obiad", "bialko",
		"zlosc", "radosc", "jablko", "drzewo", "staw", "jezioro", "zloto", "ziemia",
		"czerwien", "kolor", "upadek", "fotel", "reka", "zoltko","sen", "siemie",
		"len", "laktoza", "palic", "plot", "koniec", "poczatek", "plot","palce",
		"slonce", "slota", "jesien", "wiosna", "jesien", "zima"
	};
	
	public static final String[] tags = {"epika", "liryka", "dramat", "thriller", 
			"horror", "poezja", "s-f", "fantasy", "romans", "komedia", "tragedia",
			"tragikomedia", "zwierzeta"
	};
	
	protected final String[] names = {
		"Jan", "Adam", "Wojciech", "Paweł", "Marek", "Stanisław", "Karol", "Jakub",
		"Marcin", "Zdzisław", "Tadeusz", "Maciej", "Sebastian", "Zbigniew", "Artur",
		"Piotr", "Szymon", "Michał", "Tomasz", "Andrzej", "Wiktor", "Arkadiusz",
		"Krzysztof", "Rafał", "Bogdan", "Bartłomiej", "Bartosz", "Aaron","Agenor","Amadeusz","Apollo","Abdon","Ageusz","Amalia","Apolonia","Abel","Agnieszka","Ambroży","Apoloniusz","Abercjusz","Agrypina","Amedeusz","Ariadna","Abraham","Aida","Amelia","Arkadiusz","Absalon","Alan","Amon","Arkady","Achacjusz","Alban","Amos","Arletta","Achacy","Albaniusz","Ananiasz","Arnold","Achilles","Albert","Anastazja","Arnolf","Ada","Alberta","Anastazy","Aron","Adalbert","Albertyna","Anatol","Arseniusz","Adam","Albin","Anatolia","Artemon","Adamina","Albina","Andron","Artur","Adaukt","Albrecht","Andonik","Artus","Addar","Aldona","Andrzej","Arystarch","Adela","Aleksander","Aneta","Asteria","Adelajda","Aleksandra","Angel","Asteriusz","Adelina","Aleksy","Angelika","Atanazja","Ado","Alf","Angelina","Atanazy","Adolf","Alfons","Angelus","August","Adolfa","Alfonsyna","Anicet","Augusta","Adolfina","Alfred","Aniela","Augustyn","Adria","Alfreda","Anita","Augustyna","Adrian","Alicja","Anna","Auksencjusz","Adrianna","Alina","Antoni","Aureli","Afanazy","Alma","Antonin","Aurelia","Aga","Alojza","Antonina","Aurelian","Agapit","Alojzy","Antym","Aureliusz","Agata","Alpinian","Anzelm","Aurora","Agaton","Amadea","Apolinary","Axel"
		, "Dacjan", "Demokryt", "Dobromierz", "Dominik", "Dadźbog", "Dersław", "Dobromił", "Dominika", "Dagmara", "Dezyderia", "Dobromiła", "Domisława", "Dagobert", "Dezyderiusz", "Dobromir", "Domosław", "Dalebor", "Dezydery", "Dobromira", "Donat", "Dalegor", "Diana", "Dobromysł", "Donata", "Dalemir", "Dianna", "Dobronieg", "Doris", "Dalia", "Dina", "Dobroniega", "Dorota", "Damazy", "Diogenes", "Dobrosław", "Drogomił", "Damian", "Dionizja", "Dobrosława", "Drogomir", "Dan", "Dionizjusz", "Dobrowiest", "Drogomysł", "Daniel", "Dionizy", "Dobrowit", "Drogosław", "Daniela", "Długosz", "Dobrowój", "Drogosława", "Danisz", "Dobiegniew", "Dobrymir", "Dymitr", "Danuta", "Dobiemiest", "Dolores", "Dymitriusz", "Daria", "Dobiemir", "Domamir", "Dytrych", "Dariusz", "Dobiesław", "Domarad", "Dyzma", "Dawid", "Dobiesława", "Domarat", "Dziersław", "Dawida", "Dobisława", "Domasław", "Dziersława", "Dąbrówka", "Dobrawa", "Domasława", "Dzierżykraj", "Delfin", "Dobrocha", "Domawit", "Dzierżymir", "Delfina", "Dobrochna", "Domicela", "Dzierżysław", "Demetria", "Dobrociech", "Domicjan", "Dzierżysława", "Demetriusz", "Dobrogost", "Machabeusz", "Marcjal", "Maur", "Miłowit", "Maciej", "Marcjan", "Maura", "Mina", "Magdalena", "Marcjanna", "Maurycy", "Minodora", "Magnus", "Marek", "Mauryn", "Mira", "Maja", "Maria", "Mechtylda", "Mirabella", "Makary", "Marian", "Medard", "Mirella", "Maksym", "Marianna", "Melania", "Miron", "Maksymilian", "Marietta", "Melchior", "Mironieg", "Maksymin", "Marika", "Metody", "Mironiega", "Malina", "Marina", "Męcimir", "Mirogniew", "Malkolm", "Mariola", "Michalina", "Mirosław", "Malwin", "Mariusz", "Michał", "Mirosława", "Malwina", "Marlena", "Mieczysław", "Modest", "Małgorzata", "Marta", "Mieczysława", "Modesta", "Mamert", "Martyn", "Mieszko", "Mojmir", "Manfred", "Martyna", "Mikołaj", "Mokij", "Manfreda", "Martynian", "Milena", "Monika", "Manswet", "Maryla", "Milenia", "Morzysław", "Manuela", "Maryna", "Miligost", "Mścibor", "Marcel", "Marzena", "Miłogost", "Mścigniew", "Marcela", "Masław", "Miłorad", "Mścisław", "Marceli", "Materna", "Miłosław", "Mścisława", "Marcelin", "Mateusz", "Miłosława", "Mściwój", "Marcelina", "Matron", "Miłosz", "Myślibor", "Marcin", "Matylda", "Miłowan", "Myślimir", "Pafnucy", "Pelagia", "Pompejusz", "Przedbor", "Pakosław", "Pelagiusz", "Porfirion", "Przedpełk", "Pakosz", "Petronela", "Potencjana", "Przedwoj", "Pankracy", "Petronia", "Prakseda", "Przemił", "Pantaleon", "Petroniusz", "Priam", "Przemysł", "Paramon", "Pęcisław", "Probus", "Przemysław", "Parys", "Pęcisława", "Prochor", "Przybyczest", "Paschalis", "Pękosław", "Prokop", "Przybygniew", "Patrycja", "Pia", "Prosimir", "Przybymir", "Patrycjusz", "Pimen", "Prosper", "Przybyrad", "Patrycy", "Piotr", "Prot", "Przybysław", "Patryk", "Pius", "Protazy", "Przybysława", "Paula", "Placyd", "Prudencjusz", "Przybywoj", "Paulin", "Placydia", "Pryska", "Pudens", "Paulina", "Platon", "Przecław", "Pulcheria", "Paweł", "Polikarp", "Przecława"

	};
	
	protected final String[] surnames = {
		"Sitek", "Trzonek", "Marcjanik", "Szymański", "Rybak", "Gonciarz", "Kurzeja",
		"Giza", "Wójcik", "Kaczanowski", "Mula", "Kozak", "Stefański", "Włodarczyk", 
		"Rębalski", "Nowak", "Kowalski"
	};
	
	
	public RandomObjectFactory() {

	}
	
	public String[] getNames() {
		return names;
	}

	public String[] getSurnames() {
		return surnames;
	}

	public Book getPlainBook(){
		String title = randomClause(TITLELEN + rand.nextInt(TITLELEN));
		String description = randomClause(DESCRIPTIONLEN + rand.nextInt(DESCRIPTIONLEN));
		String tags = randomTags(TAGSLEN + rand.nextInt(2*TAGSLEN));
		Integer rank = rand.nextInt(MAXRANK);
		Book book = new Book(title, tags, rank, description);
		
		return book;
	}
	
	public Book getPlainBookWithAuthor(){
		String title = randomClause(TITLELEN + rand.nextInt(TITLELEN));
		String description = randomClause(DESCRIPTIONLEN + rand.nextInt(DESCRIPTIONLEN));
		String tags = randomTags(TAGSLEN + rand.nextInt(2*TAGSLEN));
		Integer rank = rand.nextInt(MAXRANK);
		Book book = new Book(title, tags, rank, description);
		book.setAuthor(getPlainAuthor());
		return book;
	}
	
	public Author getPlainAuthor(){
		Author author = new Author();
		
		author.setName(names[rand.nextInt(names.length)]);
		author.setSurname(surnames[rand.nextInt(surnames.length)]);
		int year = rand.nextInt(30) + 50; 
		int month = rand.nextInt(11) + 1;
		int date = rand.nextInt(30) + 1;
		author.setBirthday(new Date(year, month, date));
		return author;
	}

	protected String randomClause(int len){
		StringBuffer sb = new StringBuffer();
		sb.append(StringUtils.capitalize(randomWord()));
		for (int i = 0; i < len-1; i++){
			sb.append(" " + randomWord());
		}
		return sb.toString();
	}
	
	protected String randomTags(int len){
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < len; i++){
			String tag = randomTag();
			if (sb.indexOf(tag)==-1){
				sb.append(tag + " ");
			} 
		}
		return sb.toString();
	}

	private String randomTag() {
		return tags[rand.nextInt(tags.length-1)];
		
	}

	private String randomWord() {
		return words[rand.nextInt(words.length-1)];
	}
	
	public void insertSampleBooks(BookDao dao, int count){
		
	}
	
	public int nextRand(int max){
		return rand.nextInt(max);
	}
}
